package test04.sync.test02.e;

import java.util.concurrent.locks.ReentrantLock;

/**
 * 多个线程共享的资源
 *
 * @Author zqx
 * @Date 2024-03-21
 */
public class PiaoRunnable implements Runnable{
    /**
     * 电影票 - 公共资源
     */
    private int piao = 50 ;

    // 第一：实例化锁对象
    ReentrantLock reentrantLock = new ReentrantLock();


    // t1 t2 t3
    @Override
    public void run() {
        while(piao >= 1) {
            sell();
        }
    }

    private void sell() {
        try {
            // 错误的示范 - 锁对象不唯一
            // ReentrantLock reentrantLock = new ReentrantLock();

            // 第二：加锁 - 当前线程必须保证把临界区的代码执行完毕
            reentrantLock.lock();

            // 第三：临界区代码 - 可能发生线程安全的代码
            if(piao > 0) {
                System.out.println(Thread.currentThread().getName() + "出售了第 " + piao + " 张票");
                piao -- ;
            }
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

        }finally {
            // 第四：释放锁
            reentrantLock.unlock();
        }
    }
}
